package gui;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.Socket;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.SwingUtilities;

import source.*;



/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class index extends javax.swing.JFrame {

	{
		//Set Look & Feel
		try
		{
			javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}


	private static final long serialVersionUID = 1L;

	private JButton jButton_Desconectar;
	private JButton jButton_AceptarNick;
	private JLabel jLabel_title_Configuracion;
	private JProgressBar jProgressBar_buscarServidor;
	private JLabel jLabel_buscarServidor;
	private JButton jButton_BuscarServidor;
	private JButton jButton_CrearServidor;
	private JLabel jLabel_title_Servidor;
	private JLabel jLabel_title_ServidorWan;
	private JLabel jLabel_title_BusquedaEnLAN;
	private JButton jButton_conexion;
	private JButton jButton_conectar;
	private JButton jButton_Enviar;
	
	private JTextField jTextField_nick;
	private JTextField jTextField_direccionDelServidor;
	private JTextField jTextField_puerto;
	private JTextField jTextField_EnvioDeTexto;
	
	private JLabel jLabel_puerto;
	private JLabel jLabel_nick;
	private JLabel jLabel_direccionDelServidor;
	
	private JDialog jDialog_conexion;

	private JEditorPane jEditorPane_Mensajes;
	private JList jList_usuariosConectados;
	private JLabel jLabel_imagen_pelea;
	private JLabel jLabel_imagen_beso;
	private JLabel jLabel_imagen_risa;
	private JLabel jLabel_title_emoticons;

	private JScrollPane jScrollPane_ScrollMensajes;

	
	// **************************** <ATRIBUTOS> *** INICIO *************************
	private Cliente cliente = null;
	private Servidor newton = null;
	private String nickname = "invitado";
	private Timer timerMensajes; // Timer para ejecutar la lectura de mensajes
	private Timer timerUsuarioConectado;
	private Timer timerServidorAtomico; // Timer del sistema de lectura y envio de mensajes del servidor
	private String version = "v0.09 Beta"; // Version de la aplicacion
	private Color colorDeFondo = new java.awt.Color(247,247,247);
	private DefaultListModel listaUsuariosConectados = new DefaultListModel();
	// **************************** <ATRIBUTOS> *** FIN *************************
	
	
	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				index inst = new index();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	// **************************** <CONSTRUCTORES> *** INICIO ****************************
	
	/**
	 * Constructor del JFrame index
	 */
	public index() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		
		try
		{
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			getContentPane().setBackground(colorDeFondo);
			this.setTitle("DIGChat - " + version);
			
			{
				jTextField_EnvioDeTexto = new JTextField();
				getContentPane().add(jTextField_EnvioDeTexto);
				jTextField_EnvioDeTexto.setBounds(12, 349, 436, 29);
				jTextField_EnvioDeTexto.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
				jTextField_EnvioDeTexto.addKeyListener(new KeyAdapter() {
					public void keyPressed(KeyEvent evt) { 
						jTextField_EnvioDeTextoKeyPressed(evt); }
					});
			}
			{
				jButton_Enviar = new JButton();
				getContentPane().add(jButton_Enviar);
				jButton_Enviar.setText("Enviar");
				jButton_Enviar.setBounds(454, 349, 87, 29);
				jButton_Enviar.setBorder(BorderFactory.createTitledBorder(""));
				jButton_Enviar.setEnabled(false);
				jButton_Enviar.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jButton_EnviarMouseClicked(evt);
					}
				});
			}
			{
				jScrollPane_ScrollMensajes = new JScrollPane();
				getContentPane().add(jScrollPane_ScrollMensajes);
				jScrollPane_ScrollMensajes.setBounds(12, 12, 435, 325);
				jScrollPane_ScrollMensajes.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
				{
					jEditorPane_Mensajes = new JEditorPane();
					jScrollPane_ScrollMensajes.setViewportView(jEditorPane_Mensajes);
					jEditorPane_Mensajes.setBackground(new java.awt.Color(255,255,255));
					jEditorPane_Mensajes.setContentType("text/html");
					jEditorPane_Mensajes.setEditable(false);
					jEditorPane_Mensajes.setText(
							"<font size='4' color='blue'>" +
							"~~~~~~~~~~~~~~~~~~~~~~~~~" +
							"<br>" +
							"DIGChat " + version +
							"<br>" +
							"Copyleft 2007 - GPL v3 " +
							"<br>" +
							"<br>" +
							"Por Diego I. G. Najar Carrascal" +
							"<br>" +
							"~~~~~~~~~~~~~~~~~~~~~~~~~" +
							"</font>" +
							"<br>" +
							"<br>"
							);
					jEditorPane_Mensajes.setPreferredSize(new java.awt.Dimension(435, 325));

				}
			}
			{
				jButton_Desconectar = new JButton();
				getContentPane().add(jButton_Desconectar);
				jButton_Desconectar.setText("Desconectar");
				jButton_Desconectar.setEnabled(false);
				jButton_Desconectar.setBounds(556, 13, 93, 29);
				jButton_Desconectar.setBorder(BorderFactory.createTitledBorder(""));
				jButton_Desconectar.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jButton_DesconectarMouseClicked(evt);
					}
				});
			}
			{
				jButton_conexion = new JButton();
				getContentPane().add(jButton_conexion);
				jButton_conexion.setText("Conexion");
				jButton_conexion.setBounds(455, 13, 93, 29);
				jButton_conexion.setBorder(BorderFactory.createTitledBorder(""));
				jButton_conexion.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jButton_conexionMouseClicked(evt);
					}
				});
			}
			{
				jLabel_title_emoticons = new JLabel();
				getContentPane().add(jLabel_title_emoticons);
				jLabel_title_emoticons.setBounds(454, 256, 196, 76);
				jLabel_title_emoticons.setBorder(BorderFactory.createTitledBorder("Emoticons"));
			}
			{
				jLabel_imagen_risa = new JLabel();
				getContentPane().add(jLabel_imagen_risa);
				jLabel_imagen_risa.setIcon(new ImageIcon(getClass().getClassLoader().getResource("gui/img/risa.gif")));
				jLabel_imagen_risa.setBounds(463, 278, 40, 22);
				jLabel_imagen_risa.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jLabel_imagen_risaMouseClicked(evt);
					}
				});
			}
			{
				jLabel_imagen_beso = new JLabel();
				getContentPane().add(jLabel_imagen_beso);
				jLabel_imagen_beso.setIcon(new ImageIcon(getClass().getClassLoader().getResource("gui/img/beso.gif")));
				jLabel_imagen_beso.setBounds(509, 280, 44, 18);
				jLabel_imagen_beso.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jLabel_imagen_besoMouseClicked(evt);
					}
				});
			}
			{
				jLabel_imagen_pelea = new JLabel();
				getContentPane().add(jLabel_imagen_pelea);
				jLabel_imagen_pelea.setIcon(new ImageIcon(getClass().getClassLoader().getResource("gui/img/pelea.gif")));
				jLabel_imagen_pelea.setBounds(559, 274, 29, 27);
				jLabel_imagen_pelea.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jLabel_imagen_peleaMouseClicked(evt);
					}
				});
			}
			{
				jList_usuariosConectados = new JList();
				getContentPane().add(jList_usuariosConectados);
				jList_usuariosConectados.setModel(listaUsuariosConectados);
				jList_usuariosConectados.setBounds(457, 63, 190, 181);
				jList_usuariosConectados.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
			}
			pack();
			this.setSize(666, 415);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	

	private JDialog getJDialog_conexion() {
		if(jDialog_conexion == null)
		{
			jDialog_conexion = new JDialog(this);
			jDialog_conexion.setLayout(null);
			jDialog_conexion.setModal(true);
			jDialog_conexion.getContentPane().setBackground(colorDeFondo);
			{
				jLabel_title_Configuracion = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_title_Configuracion);
				jLabel_title_Configuracion.setBounds(10, 6, 411, 133);
				jLabel_title_Configuracion.setBorder(BorderFactory.createTitledBorder("Configuracion"));
			}
			{
				jLabel_title_Servidor = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_title_Servidor);
				jLabel_title_Servidor.setBounds(10, 378, 411, 89);
				jLabel_title_Servidor.setBorder(BorderFactory.createTitledBorder("Crear Servidor"));
			}
			{
				jLabel_title_ServidorWan = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_title_ServidorWan);
				jLabel_title_ServidorWan.setBounds(10, 145, 411, 108);
				jLabel_title_ServidorWan.setBorder(BorderFactory.createTitledBorder("Servidor Wan / LAN"));
			}
			{
				jLabel_title_BusquedaEnLAN = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_title_BusquedaEnLAN);
				jLabel_title_BusquedaEnLAN.setBounds(10, 261, 411, 108);
				jLabel_title_BusquedaEnLAN.setBorder(BorderFactory.createTitledBorder("Buscar en LAN y conectarse"));
			}
			{
				jLabel_direccionDelServidor = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_direccionDelServidor);
				jLabel_direccionDelServidor.setText("Direccion del servidor");
				jLabel_direccionDelServidor.setBounds(20, 180, 137, 17);
			}
			{
				jTextField_direccionDelServidor = new JTextField();
				jDialog_conexion.getContentPane().add(jTextField_direccionDelServidor);
				jTextField_direccionDelServidor.setText("127.0.0.1");
				jTextField_direccionDelServidor.setBounds(21, 201, 137, 25);
				jTextField_direccionDelServidor.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
				jTextField_direccionDelServidor.setEnabled(false);
			}
			{
				jLabel_puerto = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_puerto);
				jLabel_puerto.setText("Puerto de conexion");
				jLabel_puerto.setBounds(23, 82, 123, 17);
			}
			{
				jTextField_puerto = new JTextField();
				jDialog_conexion.getContentPane().add(jTextField_puerto);
				jTextField_puerto.setText("1985");
				jTextField_puerto.setBounds(23, 102, 59, 25);
				jTextField_puerto.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
				jTextField_puerto.setEnabled(false);
			}
			{
				jLabel_nick = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_nick);
				jLabel_nick.setText("Nick");
				jLabel_nick.setBounds(22, 26, 27, 17);
			}
			{
				jTextField_nick = new JTextField();
				jDialog_conexion.getContentPane().add(jTextField_nick);
				jTextField_nick.setBounds(21, 45, 137, 25);
				jTextField_nick.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
				jTextField_nick.setText(nickname);
			}
			{
				jButton_CrearServidor = new JButton();
				jDialog_conexion.getContentPane().add(jButton_CrearServidor);
				jButton_CrearServidor.setText("Crear servidor");
				jButton_CrearServidor.setBounds(302, 416, 105, 40);
				jButton_CrearServidor.setBorder(BorderFactory.createTitledBorder(""));
				jButton_CrearServidor.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jButton_CrearServidorMouseClicked(evt);
					}
				});
				jButton_CrearServidor.setEnabled(false);
			}
			{
				jLabel_buscarServidor = new JLabel();
				jDialog_conexion.getContentPane().add(jLabel_buscarServidor);
				jLabel_buscarServidor.setText("Buscar un servidor LOCAL");
				jLabel_buscarServidor.setBounds(21, 300, 215, 17);
			}
			{
				jProgressBar_buscarServidor = new JProgressBar();
				jDialog_conexion.getContentPane().add(jProgressBar_buscarServidor);
				jProgressBar_buscarServidor.setBounds(21, 325, 210, 18);
				jProgressBar_buscarServidor.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
				jProgressBar_buscarServidor.setStringPainted(true);
				jProgressBar_buscarServidor.setMinimum(0);
				jProgressBar_buscarServidor.setMaximum(255);
				
			}
			{
				jButton_BuscarServidor = new JButton();
				jDialog_conexion.getContentPane().add(jButton_BuscarServidor);
				jButton_BuscarServidor.setText("Buscar Servidor");
				jButton_BuscarServidor.setBounds(290, 317, 118, 40);
				jButton_BuscarServidor.setBorder(BorderFactory.createTitledBorder(""));
				jButton_BuscarServidor.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jButton_BuscarServidorMouseClicked(evt);
					}
				});
				jButton_BuscarServidor.setEnabled(false);
			}
			{
				jButton_conectar = new JButton();
				jDialog_conexion.getContentPane().add(jButton_conectar);
				jDialog_conexion.getContentPane().add(getJButton_AceptarNick());
				jButton_conectar.setText("Conectar");
				jButton_conectar.setBounds(302, 201, 105, 40);
				jButton_conectar.setBorder(BorderFactory.createTitledBorder(""));
				jButton_conectar.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						jButton_conectarMouseClicked(evt);
					}
				});
				jButton_conectar.setEnabled(false);
			}
			jDialog_conexion.pack();
			jDialog_conexion.setSize(438, 505);
			jDialog_conexion.setLocation(370, 260);
			jDialog_conexion.setPreferredSize(new java.awt.Dimension(438, 505));
		}
		return jDialog_conexion;
	}

	
	
	// **************************** <CONSTRUCTORES> *** FIN ****************************
	
	
	
	// **************************** <COMANDOS> *** INICIO ****************************
	
	/**
	 * Busca en la red LOCAL un servidor ya creado, si este lo encuentra ingresa en el
	 * 
	 * @param inicioDeIp Inicio de la direccion IP de la red, ejemplo 192.168.1
	 * @param puerto Puerto en el cual se buscara el servidor
	 */
	private void buscarServidorActivo(String inicioDeIp, int puerto) {
				
		boolean encontre = false;
		String direccion;
		int num = 90;
		Socket socketDelServidor = null;
		
		jTextField_direccionDelServidor.setEditable(false);
		jButton_conectar.setEnabled(false);
		jButton_BuscarServidor.setEnabled(false);
		jButton_CrearServidor.setEnabled(false);
		
		// Repito mientras NO encontre y num sea menor a 255, ya que la IP son hasta 255
		while ((!encontre) && (num < 255))
		{
			// Creamos la direccion IP a probar
			num++;
			direccion = inicioDeIp + "." + num;
			
			jLabel_buscarServidor.setText("Buscando en " + direccion); // Imprimo la direccion en la que estoy buscando
			jProgressBar_buscarServidor.setValue(num); // Incremento el JProgressBar
			
			// Intenta conectarse a la direccion, si esto falla lo atrapa el catch
			// si no hay ninguna falla este se conecta
			try
			{
				socketDelServidor = new Socket(direccion, puerto);
			}
			catch (Exception e)
			{
				socketDelServidor = null;
				System.out.println(e);
			}
			
			// Si el servidor fue encontrado en la RED LOCAL
			if (socketDelServidor != null)
			{
				jLabel_buscarServidor.setText("Servidor Local encontrado");
				
				encontre = true;
				
				cliente = new Cliente(nickname,socketDelServidor);
					
				jTextField_direccionDelServidor.setText(direccion);
				
				jButton_Enviar.setEnabled(true); // habilito el boton enviar
				jButton_Desconectar.setEnabled(true); // habilito el boton desconectar
				
				// Habilitamos el Lector de mensajes
				timerMensajes = new Timer(1*1000, lectorDeMensajes); // Asignamos un timer que pasado 1seg ejecute lectoreDeMensajes
				timerMensajes.start(); // Iniciamos el timer lectoreDeMensajes
	
				// Habilitamos el sistema de informacion usuario conectado
				timerUsuarioConectado = new Timer(10*1000, infoDeUsuarioConectado); // Asignamos un timer que pasado 4seg ejecute infoDeUsuarioConectado
				timerUsuarioConectado.start(); // Iniciamos el timer infoDeUsuarioConectado
				
				jDialog_conexion.setVisible(false);
				
			}			
		}
		
		// Si el servidor no fue encontrado en la RED LOCAL
		if (!(encontre))
		{
			jLabel_buscarServidor.setText("No se encontro servidor");
		}
		
	}
	
	/**
	 * Busca el Path de un archivo - Es necesario cuando se ejecuta el programa desde el jar
	 * Por ejemplo si quiero saber el path de una imagen debo llamar a buscarPathDeArchivo de la siguiente forma
	 * buscarPathArchivo("/gui/img/beso.gif")
	 */
	private URL buscarPathDeArchivo(String archivo) {
		URL ruta = index.class.getResource(archivo);
		return ruta;
	}
	
	/**
	 * Busca en una cadena de tipo string variables y parametros HTML
	 * para evitar la inyeccion de exploit's en el mensaje
	 */
	private void buscarHtmlInjection(String cadena) {
		cadena = sustituir(cadena,"<script","");
	}
	
	/**
	 * Envia el mensaje al servidor
	 * Si es necesario enviar algun codigo al servidor o a los usuarios debe enviar por parametros el codigo tipo String
	 * 
	 * @param codigo Codigo para el servidor
	 */
	private void enviarMensaje(String codigo) {
		
		//Creamos un objeto mensaje para que este metodo lo manipule
		Mensaje msj;
		
		// Obtenemos el mensaje a enviar del JTextField
		String mensaje = jTextField_EnvioDeTexto.getText();
		
		// Buscamos antes de enviar, si el mensaje no tiene ningun exploit
		buscarHtmlInjection(mensaje);
		
		// Creamos el objecto Mensaje que sera el que se envie
		msj = new Mensaje(nickname,mensaje,codigo);

		// Enviamos el mensaje al servidor
		cliente.enviarMensaje(msj);
	}
	
	/**
	 * Sustituye una cadena por otra
	 * @param cadena cadena a modificar
	 * @param quitar palabra a sustituir
	 * @param poner palabra por la que sustituye
	 * @return retorna la cadena modificada
	 */
	public String sustituir(String cadena, String quitar, String poner)
	{
		String resultado = cadena;
		
		if (cadena == null || quitar == null || poner == null)
		{
			return resultado;
		}
		
		if (!cadena.equals("") && !quitar.equals(""))
		{
			int posicion = cadena.indexOf(quitar);
			
			if (posicion!=-1)
			{
				int tamanio = quitar.length();
				String resto = cadena.substring(posicion+tamanio);
				resultado = cadena.substring(0,posicion) + poner + sustituir(resto,quitar,poner);
			}
		}
		
		return resultado;
	}
	
	/**
	 * Busca si ya esta el usuario en la lista de usurios
	 * @param usuario Nombre del usuario a buscar
	 * @return Retorna true si encontro el usuario, retorna falso si no encontro el usuario
	 */
	private boolean buscarUsuario(String usuario) {
		boolean encontre = false;
		int i = 0;
		
		while ((!encontre) && (i < listaUsuariosConectados.getSize()))
		{
			encontre = listaUsuariosConectados.getElementAt(i).equals(usuario);
			i++;
		}
		
		return encontre;
	}
	
	// Sistema de lector de mensajes y actualizacion del jEditorPane
	ActionListener lectorDeMensajes = new ActionListener() {
	      
		public void actionPerformed(ActionEvent actionEvent)
		{
			Mensaje msj;
			
			String cadena;
			String nombre;
			String contenidoMensaje;
					
			// Llamamos al metodo recibirMensaje() del cliente para comprobar si el servidor
			// envio algun mensaje
			msj = cliente.recibirMensaje();
			
			// Si el mensaja obtenido no es null imprimimos el mensaje
			if (msj != null)
			{
				if (msj.getCodigo().equals("usuarioConectado"))
				{
					if (!buscarUsuario(msj.getNombre()))
					{
						listaUsuariosConectados.addElement(msj.getNombre());
						jList_usuariosConectados.setModel(listaUsuariosConectados);
					}
				}
				else
				{
					// Debo eliminar el body y el html de cierre asi agrego mas contenido
					cadena = jEditorPane_Mensajes.getText();
					cadena = sustituir(cadena,"</body>","");
					cadena = sustituir(cadena,"</html>","");
					
					// Preparacion del mensaje
					nombre = "<font color='blue'>" + msj.getNombre() + ": " + "</font>";
					contenidoMensaje = msj.getTexto() + "<br>";
					
					// Armo el texto completo
					cadena = cadena + nombre + contenidoMensaje;

					// Busco y cambio las frases por emoticons
					cadena = sustituir(cadena,".-risa-.","<img src='" + buscarPathDeArchivo("/gui/img/risa.gif") + "' width='40' height='22' border='0'></img>");
					cadena = sustituir(cadena,".-beso-.","<img src='" + buscarPathDeArchivo("/gui/img/beso.gif") + "' width='44' height='18' border='0'></img>");
					cadena = sustituir(cadena,".-pelea-.","<img src='" + buscarPathDeArchivo("/gui/img/pelea.gif") + "' width='29' height='27' border='0'></img>");
					
					// Actualizamos el texto en el jEditorPane
					jEditorPane_Mensajes.setText(cadena);
					
					// Bajamos el scroll hasta el ultimo mensaje enviado
					jEditorPane_Mensajes.setCaretPosition(jEditorPane_Mensajes.getDocument().getLength());
				}
			}
		}
	};
	
	// Sistema de lector de mensajes y actualizacion del jEditorPane
	ActionListener infoDeUsuarioConectado = new ActionListener() {
	      
		public void actionPerformed(ActionEvent actionEvent)
		{
			enviarMensaje("usuarioConectado");
		}
	};
	
	// Sistema de envio y recepcion de mensajes del servidor
	ActionListener servidorAtomico = new ActionListener() {
	      
		public void actionPerformed(ActionEvent actionEvent)
		{
			Mensaje msj = null;

			msj = newton.recibirMensaje(); // Busca mensajes enviados al servidor
		
			if (msj != null)
			{
				newton.enviarMensaje(msj); // Envia el mensaje a los clientes
			}
		}
	};

	
	// **************************** <COMANDOS> *** FIN ****************************
	
	
	// **************************** <EVENTOS> *** INICIO ****************************
	
	/**
	 * Captura el click sobre el boton "Conectar"
	 * 1- Si el boton esta habilitado ejecuta las acciones
	 * 2- Obtenemos los datos del Frame y los almacenamos en objectos
	 * 3- Creamos un nuevo cliente y le indicamos el servidor y puerto a donde debe conectarse
	 * 4- Deshabilitamos los botones y editores
	 * 5- Habilitamos el lector de mensajes para que se actulice el JEditorPane c/ves que llegue uno
	 * @param evt Evento producido por el click sobre el boton
	 */
	private void jButton_conectarMouseClicked(MouseEvent evt) {
		
		// Si el boton esta habilitado quiere decir que no esta conectado al servidor
		// pero una vez conectado al servidor se desactiva para que no produzca alguna
		// nueva conexion
		if (jButton_conectar.isEnabled())
		{
			// Obtenemos los datos del Frame
			String servidor = jTextField_direccionDelServidor.getText();
			int puerto = Integer.parseInt(jTextField_puerto.getText());
			
			// Creamos un cliente nuevo con los datos obtenidos
			cliente = new Cliente(nickname,servidor,puerto);
			
			// Deshabilito botones y jtextfield del JDialog
			jTextField_direccionDelServidor.setEnabled(false);
			jButton_conectar.setEnabled(false);
			jButton_BuscarServidor.setEnabled(false);
			jButton_CrearServidor.setEnabled(false);
			
			// Habilito el Boton Enviar y Desconectar
			jButton_Enviar.setEnabled(true); // habilito el boton enviar
			jButton_Desconectar.setEnabled(true); // habilito el boton desconectar
			
			// Habilitamos el Lector de mensajes
			timerMensajes = new Timer(1*1000, lectorDeMensajes); // Asignamos un timer que pasado 1seg ejecute lectoreDeMensajes
			timerMensajes.start(); // Iniciamos el timer lectoreDeMensajes

			// Habilitamos el sistema de informacion usuario conectado
			timerUsuarioConectado = new Timer(10*1000, infoDeUsuarioConectado); // Asignamos un timer que pasado 4seg ejecute infoDeUsuarioConectado
			timerUsuarioConectado.start(); // Iniciamos el timer infoDeUsuarioConectado

			// Desaparecemos el jDialog_conexion
			jDialog_conexion.setVisible(false);
		}
		
	}
	
	/**
	 * Captura el click sobre el boton "Enviar"
	 * 1- Enviar el mensaje escrito sobre el jEditorPane
	 * @param evt Evento producido por el click sobre el boton
	 */
	private void jButton_EnviarMouseClicked(MouseEvent evt) {
		
		if (jButton_Enviar.isEnabled())
		{
			enviarMensaje(""); // Ejecuta el metodo enviarMensaje(), sin codigo
			
			// Limpiamos el texto ingresado del jTextField
			jTextField_EnvioDeTexto.setText("");
		}
	}
	
	/**
	 * Captura el teclado cuando se esta escribiendo en el jTextField
	 * 1- Comprueba que la tecla precionada sea el ENTER
	 * 2- Enviar el mensaje escrito sobre el jEditorPane
	 * @param evt Evento producido por una tecla
	 */
	private void jTextField_EnvioDeTextoKeyPressed(KeyEvent evt) {
		
		// Si el boton Enviar esta habilitado
		if (jButton_Enviar.isEnabled())
		{
			// Si la tecla presionada es el ENTER (KeyCode = 10) enviamos el mensaje
			if (evt.getKeyCode()==10)
			{
				enviarMensaje(""); // Ejecuta el metodo enviarMensaje
				
				// Limpiamos el texto ingresado del jTextField
				jTextField_EnvioDeTexto.setText("");
			}
		}
	}
	
	/**
	 * Captura el click sobre el boton "Desconectar"
	 * 1- Envia una senial al servidor para que nos desconecte
	 * 2- Detiene el timer de lectura de mensajes
	 * @param evt Evento producido por el click sobre el boton
	 */
	private void jButton_DesconectarMouseClicked(MouseEvent evt) {
		
		if (jButton_Desconectar.isEnabled())
		{
			// Falta enviarle una senial al servidor asi nos desconecta
			
			timerMensajes.stop(); // Detenemos el timer
			timerUsuarioConectado.stop(); // Detenemos el timer
			timerServidorAtomico.stop(); 
		}		
	}
	
	/**
	 * Captura el click sobre el boton "Conexion"
	 * 1- Crea el jDialog conexion
	 * 2- Hace visible el jDialog conexion
	 * @param evt Evento producido por el click sobre el boton
	 */
	private void jButton_conexionMouseClicked(MouseEvent evt) {
		// Crea y da parametros al jDialog_conexion
		getJDialog_conexion();
		
		// Hace visible el jDialog_conexion
		jDialog_conexion.setVisible(true);
		
	}


	private void jLabel_imagen_risaMouseClicked(MouseEvent evt) {
		jTextField_EnvioDeTexto.setText(jTextField_EnvioDeTexto.getText() + " .-risa-. " );
	}
	
	private void jLabel_imagen_besoMouseClicked(MouseEvent evt) {
		jTextField_EnvioDeTexto.setText(jTextField_EnvioDeTexto.getText() + " .-beso-. " );
	}
	
	private void jLabel_imagen_peleaMouseClicked(MouseEvent evt) {
		jTextField_EnvioDeTexto.setText(jTextField_EnvioDeTexto.getText() + " .-pelea-. " );
	}
	
	
	private void jButton_CrearServidorMouseClicked(MouseEvent evt) {

		if (jButton_CrearServidor.isEnabled())
		{
			newton = new Servidor(1985);
			
			newton.aceptarClientes();
			
			timerServidorAtomico = new Timer(1*1000, servidorAtomico);
			timerServidorAtomico.start();
			
			jButton_CrearServidor.setEnabled(false);
			
			jDialog_conexion.setVisible(false);
		}
	}
	
	
	private void jButton_BuscarServidorMouseClicked(MouseEvent evt) {
		
		if (jButton_BuscarServidor.isEnabled())
		{
		
		      Runnable miRunnable = new Runnable()
		      {
		         public void run()
		         {
		            try
		            {
		               buscarServidorActivo("192.168.1", 1985);
		            }
		            catch (Exception e)
		            {
		               e.printStackTrace();
		            }
		         }
		      };
		      Thread hilo = new Thread (miRunnable);
		      hilo.start();
			
		}
	}
	
	private JButton getJButton_AceptarNick() {
		if(jButton_AceptarNick == null) {
			jButton_AceptarNick = new JButton();
			jButton_AceptarNick.setText("Aceptar");
			jButton_AceptarNick.setBounds(302, 90, 105, 40);
			jButton_AceptarNick.addMouseListener(new MouseAdapter() {
				public void mouseClicked(MouseEvent evt) {
					jButton_AceptarNickMouseClicked(evt);
				}
			});
		}
		return jButton_AceptarNick;
	}
	
	private void jButton_AceptarNickMouseClicked(MouseEvent evt) {
		
		if (jButton_AceptarNick.isEnabled())
		{
			// Obtengo el nick ingresado por el usuario y lo almaceno en nickname
			nickname = jTextField_nick.getText();
			
			// Deshabilito el boton Aceptar y el ingreso de nicks
			jTextField_nick.setEnabled(false);
			jButton_AceptarNick.setEnabled(false);
			
			// Habilito los botones y textfield luego de haber ingresado el nickname
			jTextField_direccionDelServidor.setEnabled(true);
			jButton_conectar.setEnabled(true);
			jButton_BuscarServidor.setEnabled(true);
			jButton_CrearServidor.setEnabled(true);
		}
	}

	// **************************** <EVENTOS> *** FIN ****************************

}
